package componentes.flor;

import java.awt.Color;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

import javax.media.opengl.GL;

import utils.ConversorAngulos;

import componentes.Componente3DRevolucion;

import dataType.Coordenadas3D;
import dataType.DataFlowers;
import dataType.Situacion3D;
import figuras.BSplines;
import figuras.PuntoVector;
import figuras.malla.MallaPorSplineYRevolucion;

public class Receptaculo extends Componente3DRevolucion {

	private DataFlowers dataFlowers;

	public Receptaculo(GL gl, File file) throws IOException,
			IndexOutOfBoundsException, FileNotFoundException {
		super(gl, file);
	}

	public Receptaculo(MallaPorSplineYRevolucion malla,
			ArrayList<BSplines> bsplines, GL gl) {
		super(malla, bsplines, gl);
	}

	public void dibuja(int modo) {
		super.dibuja(modo);
		gl.glPointSize(6);
		gl.glColor3d(0, 1, 0);
		gl.glPushMatrix();
		gl.glMultMatrixd(matriz.getMatriz());
		// pintamos donde irian situados los componentes
		ArrayList<Situacion3D> puntosEnPerfil = new ArrayList<Situacion3D>();
		//ArrayList<PuntoVector> extremos = new ArrayList<PuntoVector>();
		if (dataFlowers!=null&&dataFlowers.getNum() > 0) {
			for (int i = 0; i < dataFlowers.getNum(); i++) {
				ArrayList<Coordenadas3D> coord3D = dataFlowers
						.getElementos3D(i);
				Color color = Color.RED;
				switch(i){
					case 0: break;
					case 1: color = Color.GREEN;break;
					case 2: color = Color.BLUE;break;
					case 3: color = Color.YELLOW;break;
					default: break;
				}
				for (int j = 0; j < coord3D.size(); j++) {
					Coordenadas3D puntoEspacio = coord3D.get(j);
					PuntoVector extremo = this.extremoRecta(puntoEspacio.getPunto(),
							puntoEspacio.getAnguloY(), puntoEspacio.getAnguloZ());					
					puntosEnPerfil.add(new Situacion3D(puntoEspacio.getPunto(),extremo,color));					
				}
			}
		}
		for (int i = 0; i < puntosEnPerfil.size(); i++) {
			Color color = puntosEnPerfil.get(i).getColor();
			gl.glColor3d(color.getRed()/255.0,color.getGreen()/255.0,color.getBlue()/255.0);
			PuntoVector p1 = puntosEnPerfil.get(i).getPuntoEnPerfil();
			PuntoVector p2 = puntosEnPerfil.get(i).getExtremo();
			gl.glBegin(GL.GL_POINTS);
			gl.glVertex3d(p1.getX(), p1.getY(), p1.getZ());
			gl.glEnd();
			gl.glBegin(GL.GL_POINTS);
			gl.glVertex3d(p2.getX(), p2.getY(), p2.getZ());
			gl.glEnd();
			gl.glBegin(GL.GL_LINES);
			gl.glVertex3d(p1.getX(), p1.getY(), p1.getZ());
			gl.glVertex3d(p2.getX(), p2.getY(), p2.getZ());
			gl.glEnd();
		}
		gl.glPopMatrix();
	}

	private double calculaAnguloInclinacion(PuntoVector p) {
		double angulo = 0;
		PuntoVector pInicio = this.bsplines.get(0).getPerfil().get(0);
		PuntoVector pFin = this.bsplines.get(0).getPerfil().get(
				this.bsplines.get(0).getPerfil().size() - 1);
		double distancia = pInicio.getY() - pFin.getY();
		double total = (distancia / 2.0);
		double ceroInclinacion = pInicio.getY() - total;
		if (p.getY() > ceroInclinacion) {
			double factor = p.getY() - ceroInclinacion;
			angulo = (90 * factor) / total;
		} else if (p.getY() < ceroInclinacion) {
			double factor = ceroInclinacion - p.getY();
			angulo = (-90 * factor) / total;
		}
		if(p.getX()<0&&p.getY()>=0){
			angulo=180-angulo;
		}else if(p.getX()<0&&p.getY()<0){
			angulo=180+angulo;
		}else if(p.getX()>=0&&p.getY()<0){
			angulo=360-angulo;
		}
		return angulo;
	}

	public double longitudPerfil() {
		double result = 0;
		ArrayList<PuntoVector> perfil = this.bsplines.get(0).getPerfil();
		PuntoVector p1 = new PuntoVector(perfil.get(0));
		for (int i = 1; i < perfil.size(); i++) {
			PuntoVector p2 = new PuntoVector(perfil.get(i));
			PuntoVector distancia = p1.obtenVector(p2);
			result += distancia.modulo();
			p1 = p2;
		}
		return result;
	}
	
	public DataFlowers getDataFlowers() {
		return dataFlowers;
	}

	public void setDataFlowers(DataFlowers dataFlowers) {
		this.dataFlowers = dataFlowers;
	}

	private PuntoVector extremoRecta(PuntoVector p, double anguloY,
			double anguloZ) {
		int modulo = 15;
		double z = modulo/2 * Math.sin(anguloZ);
		double x = modulo/2 * Math.cos(anguloZ);
		if(anguloY==90||anguloY==-90||anguloY==270){
			x=0;
		}
		if (Math.abs(anguloY)<96&&Math.abs(anguloY)>84){
			z=0;
			x=0;
		}
		double y = modulo * Math.sin(ConversorAngulos.convertirARadianes(anguloY));
		//VER SI LUEGO NECESITARIA ESTOS DATOS PARA LAS COMPONENTES TOTALES PARA CALCULAR EL ANGULO
		//QUE FORMA LA RECTA O CON ANGULOY Y ANGULOZ VALDRIA PARA COLOCAR TODO
		return new PuntoVector(p.getX() + x, p.getY() + y, p.getZ() + z, 1);
	}
}
